From fa2fb716ec66a48d122aea14a50c24bec93b6e05 Mon Sep 17 00:00:00 2001 From: "awilliam@xenbuild2.aw" Date: Wed, 24 Jan 2007 12:28:05 -0700 Subject: [PATCH] [IA64] Fix oops message from timer_interrupton VTI domain This patch intends to fix the oops message from timer_interrupt on VTI domain. This problem occurred when we test PV-on-HVM driver by ltp-20061121. Typical message shown as follows. ltp Now Running...( Exception mode ) dom=domVTI 1 times Unable to find swap-space signature Oops: timer tick before it's due (itc=ed98bb5849,itm=ed98bb5849) Oops: timer tick before it's due (itc=f20bca8ca3,itm=f20bca8ca3) Oops: timer tick before it's due (itc=f4ea4e2b32,itm=f4ea4e2b32) mmap1(7392): unaligned access to 0x60000fffffffb634, ip=0x200000000004fad0 mmap1(7392): unaligned access to 0x60000fffffffb634, ip=0x200000000004fad0 ltp End These oops messages are generated because timer_interrupt checks the condition itc > itm. Currently Xen-hypervisor outputs following values, max(current_itc,vtm->last_itc). Sometimes oops message appeared if we use the value of vtm->last_itc as ia64_get_itc() return value, because the vtm->last_itc is same as itm. To fix this issue, it needs to add return value like +1. But, ia64_get_itc() is handled at vmx_asm_mov_from_ar@optvfault.S and it works same logic of now_itc()@vlsapic.c. And these routines shared vtm->last_itc. So I fix this problem by adding +1 at caller of update_last_itc. Signed-off-by: Atsushi SAKAI --- xen/arch/ia64/vmx/vlsapic.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/xen/arch/ia64/vmx/vlsapic.c b/xen/arch/ia64/vmx/vlsapic.c index 7a495ee547..4bc9ab5cc7 100644 --- a/xen/arch/ia64/vmx/vlsapic.c +++ b/xen/arch/ia64/vmx/vlsapic.c @@ -171,7 +171,12 @@ static void vtm_timer_fn(void *data) } else vtm->pending = 1; - update_last_itc(vtm, VCPU(vcpu, itm)); // update vITC + /* + * "+ 1" is for fixing oops message at timer_interrupt() on VTI guest. + * If oops checking condition changed to timer_after_eq() on VTI guest, + * this parameter should be erased. + */ + update_last_itc(vtm, VCPU(vcpu, itm) + 1); // update vITC } void vtm_init(VCPU *vcpu) -- 2.30.2